#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <iostream>

namespace im
{
// 声明一个全局的日志器智能指针对象，在后面进行赋值
std::shared_ptr<spdlog::logger> g_logger;

// mode - 运行模式，true - 发布模式，false - 调试模式
// file_path - 向文件输出模式的输出文件路径
// level - 日志输出的限制等级，只有等级>=level时，才会输出
void init_logger(bool mode, const std::string& file_path, int level)
{
    // 如果是调试模式，则创建标准输出日志器，输出等级为最低
    if (mode == false) {
        g_logger = spdlog::stdout_color_mt("default-logger");
        g_logger->set_level(spdlog::level::level_enum::trace);
        g_logger->flush_on(spdlog::level::level_enum::trace);
    } else {
        // 否则是发布模式，创建文件输出日志器，输出等级为传入参数level
        g_logger = spdlog::basic_logger_mt("default-logger", file_path);
        g_logger->set_level(static_cast<spdlog::level::level_enum>(level));
        g_logger->flush_on(static_cast<spdlog::level::level_enum>(level));
    }
    // 设置日志输出格式
    g_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
}

#define LOG_TRACE(format, ...) im::g_logger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) im::g_logger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) im::g_logger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) im::g_logger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) im::g_logger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) im::g_logger->critical(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
}